import 'package:dio/dio.dart';
import 'package:f_flutter_enjoy_plus/constants/index.dart';
import 'package:f_flutter_enjoy_plus/utils/Toast.dart';

class RequestDio {
  // 1. 创建dio实例
  // 2. 定义构造函数
  final Dio _dio = Dio();
  RequestDio() {
    // 3. 配置基地址 + 请求和响应的超时时间
    /*  _dio.options.baseUrl = GlobalVariable.BASE_URL;
    _dio.options.connectTimeout =
        const Duration(seconds: GlobalVariable.TIMEOUT);
    _dio.options.receiveTimeout =
        const Duration(seconds: GlobalVariable.TIMEOUT); */
    _dio
      ..options.baseUrl = GlobalVariable.BASE_URL
      ..options.connectTimeout = const Duration(seconds: GlobalVariable.TIMEOUT)
      ..options.receiveTimeout =
          const Duration(seconds: GlobalVariable.TIMEOUT);
    // 4. 设置拦截器 (请求和响应拦截器)
    _registerInterceptors();
  }
  // 5. 封装请求方法
  // get
  Future get(String url, {Map<String, dynamic>? params}) async {
    final result = await _dio.get(url, queryParameters: params);
    // 将请求结果返回 (封装一个方法 - 统一去处理)
    return _handleResult(result);
  }

  // post
  Future post(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.post(url, data: data);
    return _handleResult(result);
  }

  // put
  Future put(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.put(url, data: data);
    return _handleResult(result);
  }

  // delete
  Future delete(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.delete(url, data: data);
    return _handleResult(result);
  }

  // 针对于所有的请求 - 统一处理返回的结果
  _handleResult(Response<dynamic> response) {
    if (response.data['code'] == GlobalVariable.CODE_SUCCESS) {
      // 请求的业务成功
      return response.data['data'];
    }
    // 请求业务失败 -> 抛出异常 (程序员) / 增加提示 (用户)
    // 增加提示
    PromptAction.showToast(response.data['message']);
    throw Exception(response.data['message']);
  }

  // 拦截器
  _registerInterceptors() {
    _dio.interceptors.add(
      InterceptorsWrapper(
        // 请求拦截
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          return handler.next(options);
        },
        // 响应拦截
        onResponse: (Response response, ResponseInterceptorHandler handler) {
          // 如果你想终止请求并触发一个错误，你可以使用 `handler.reject(error)`。
          // 针对于http状态码结果 大于等于200 && 小于 300 (请求成功)
          if (response.statusCode! >= 200 && response.statusCode! < 300) {
            return handler.next(response);
          } else {
            // 4开头 (客户端异常 -> 请求路径 错误 / 鉴权 (token))  5开头 (服务端异常)
            // 针对于401 授权失败的情况
            // 提示用户
            PromptAction.showFail(response.statusMessage!);
            // 返回一个错误的Future / 鸿蒙 前端 错误的promise
            return handler
                .reject(DioException(requestOptions: response.requestOptions));
          }
        },
        // 异常处理
        onError: (DioException error, ErrorInterceptorHandler handler) {
          // 如果你想完成请求并返回一些自定义数据，你可以使用 `handler.resolve(response)`。
          return handler.next(error);
        },
      ),
    );
  }
}

final requestDio = RequestDio();
